import 'package:flutter/material.dart';
import 'dart:async';

class TestStream extends StatefulWidget {
  @override
  _TestStreamState createState() => _TestStreamState();
}

class _TestStreamState extends State<TestStream> {
  // String _str = "我会变哦";
  Map<String, Map<String, dynamic>> _str = {
    'info': {'name': '李白', 'age': 12},
  };
  //步骤1:初始化一个StreamController<可以是 int string...  一般是model>
  final StreamController<dynamic> _streamController =
      StreamController<dynamic>();

  @override
  void dispose() {
    //步骤2.关流，不管流会消耗资源，同时会引起内存泄漏
    _streamController.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        //步骤3.使用StreamBuilder构造器
        StreamBuilder(
          // 监听Stream，每次值改变的时候，更新Text中的内容
          stream: _streamController.stream,
          // initialData: _str['info']?['name'],
          builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
            return Text('点击的时候这个值会改变: ${snapshot.data}');
          },
        ),
        TextButton(
          // 点击按钮，更改_str['info']?['name'] 的值，同时通过Sink将它发送给Stream；
          // 注入一个值时，会引起StreamBuilder的监听，StreamBuilder重建并刷新_str
          //步骤4.往StreamBuilder里添加流，数据变了，就用通知小部件
          onPressed: () {
            _str['info']?['name'] = "喝喝喝";
            _streamController.sink.add(_str['info']?['name'] ?? '');
          },
          child: Text('ssss'),
        )
      ],
    );
  }
}
